package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 刘远望
 * Date: 2025-05-21
 * Time: 17:18
 */
//终止线程 定义条件
public class Demo10 {

    public static boolean isFinshed = false;//类的成员变量 生命周期也是由GC管理 不用担心周期失效的问题GC是垃圾回收

    public static void main(String[] args) throws InterruptedException {

        //isFinshed放在这里(触发了变量捕获)
        //boolean isFinshed  = false;

        Thread thread = new Thread(() -> {
           while (!isFinshed) {
               System.out.println("hello thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
            System.out.println("线程结束");
        });
        thread.start();

        Thread.sleep(3000);
        /**
         * 变量捕获
         * lambda是回调函数 程序执行很久后才真正创建出线程才会执行
         * 有可能线程创建好后main这里的方法都执行完了 isFinshed都销毁了
         *为了解决问题 就会触发变量捕获 就给isfinsed拷贝了一份 拷贝给了lambda里面
         * 无论是否销毁 就不影响lambda里面的执行了
         * 如果修改了一方 另一方就不会变化 所以java语法就不允许修改
         * 对于引用 只是不能改变引用指向的对象 但是对于指向的本体修改没事(由GC管理不会随着方法的结束而销毁)
         * 综上所以下列isFinshed就不允许修改
         */
        isFinshed = true;

    }
}
